package com.xzgj.fmmall.service.impl;

import com.xzgj.fmmall.dao.ShoppingCartMapper;
import com.xzgj.fmmall.entity.ProductComments;
import com.xzgj.fmmall.entity.ShoppingCart;
import com.xzgj.fmmall.entity.UserAddr;
import com.xzgj.fmmall.service.ShoppingCartService;
import com.xzgj.fmmall.vo.ResStatus;
import com.xzgj.fmmall.vo.ResultVO;
import com.xzgj.fmmall.vo.ShoppingCartVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.*;

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Resource
    private ShoppingCartMapper shoppingCartMapper;
    @Override
    public ResultVO addShoppingCart(ShoppingCart cart) {
        if (cart == null || cart.getCart_id().intValue() <= 0 || cart.getCart_num().length() <= 0
                || cart.getProduct_id().length() <=0 || cart.getProduct_price().length() <=0){
            return new ResultVO(ResStatus.NO,ResStatus.goodInfoInCartIsNotValid,null);

        }
        int i = shoppingCartMapper.insert(cart);
        if (i > 0){
            return new ResultVO(ResStatus.OK,ResStatus.SUCCESS,null);

        }else {
            return new ResultVO(ResStatus.NO,ResStatus.FAILURE,null);

        }
    }

    @Transactional(propagation = Propagation.SUPPORTS)//隔离级别
    public ResultVO listShoppingCartsByUserId(int userId) {
        List<ShoppingCartVO> list = shoppingCartMapper.selectShoppingCartByUserId(userId);
        return new ResultVO(ResStatus.OK,ResStatus.SUCCESS,list);
    }

    @Override
    public ResultVO updateCartNum(int cartId, int cartNum) {
        int i = shoppingCartMapper.updateCardNumByCardId(cartId,cartNum);
        if (i > 0){
            return new ResultVO(ResStatus.OK,ResStatus.SUCCESS,null);
        }else {
            return new ResultVO(ResStatus.NO,ResStatus.FAILURE,null);

        }
     }

    @Override


/*
foreach的主要用在构建in条件中，它可以在SQL语句中进行迭代一个集合。
 foreach元素的属性主要有 item，index，collection，open，separator，close。
 item表示集合中每一个元素进行迭代时的别名，
 index指 定一个名字，用于表示在迭代过程中，每次迭代到的位置，
 open表示该语句以什么开始，
 separator表示在每次进行迭代之间以什么符号作为分隔 符，
 close表示以什么结束。
 在使用foreach的时候最关键的也是最容易出错的就是collection属性，该属性是必须指定的，但是在不同情况 下，该属性的值是不一样的，主要有一下3种情况：
  1. 如果传入的是单参数且参数类型是一个List的时候，collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候，collection的属性值为array
  3. 如果传入的参数是多个的时候，我们就需要把它们封装成一个Map了，当然单参数也可以封装成map

-- collection--- 数组类型的集合
-- item      --- 遍历集合中每一个元素的别名
-- #{cartId} --- 遍历过程中每一个元素的入参，单数---切记！！！
 */

    public ResultVO listShoppingCartsByCartIds(String cartIds) {
        //使用tkmapper只能查询某张表中的信息，没有商品名称、单价、套餐等信息
        String[] arr = cartIds.split(",");//截取为数组
        List<Integer> cart_Ids = new ArrayList<>();
        for (int i = 0;i < arr.length;i++){
            cart_Ids.add(Integer.parseInt(arr[i]));
        }

        List<ShoppingCartVO> shoppingCartVOS = shoppingCartMapper.selectShoppingCartByCartId(cart_Ids);
        return new ResultVO(ResStatus.OK,ResStatus.SUCCESS,shoppingCartVOS);
    }

    @Override
    public ResultVO deleteShoppingCartsByCartIds(String cartIds) {
        String[] arr = cartIds.split(",");//截取为数组
        String cartId = "";int resultCount = 0;
        List<String> result_Ids = new ArrayList<>();

        for (int i = 0;i < arr.length;i++){
            cartId = arr[i];
            Example example = new Example(ShoppingCart.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("cart_id",cartId);
            resultCount = shoppingCartMapper.deleteByExample(example);
            if (resultCount > 0){
                result_Ids.add(cartId);
            }
        }

        if (result_Ids.size() > 0){

            String operationStr = "cartids:" + result_Ids.toString() + "操作成功;";
            return new ResultVO(ResStatus.OK,operationStr,null);

        }else {
            return new ResultVO(ResStatus.NO,ResStatus.operationFailure,null);

        }
    }

    /**
     * 求差集
     *
     * @param m
     * @param n
     * @return
     */
    private static String[] getDiff(String[] m, String[] n)
    {
        // 将较长的数组转换为set
        Set<String> set = new HashSet<String>(Arrays.asList(m.length > n.length ? m : n));

        // 遍历较短的数组，实现最少循环
        for (String i : m.length > n.length ? n : m)
        {
            // 如果集合里有相同的就删掉，如果没有就将值添加到集合
            if (set.contains(i))
            {
                set.remove(i);
            } else
            {
                set.add(i);
            }
        }

        String[] arr = {};
        return set.toArray(arr);
    }

}
